Skip to content

docs: prepare metadata-based module maintenance - #2936

Merged
Jared Holgate (jaredfholgate) merged 18 commits into
mainfrom
jaredfholgate-metadata-maintenance-docs
Sep 22, 2026
Merged

Jared Holgate (jaredfholgate) merged 18 commits into
mainfrom
jaredfholgate-metadata-maintenance-docs

Conversation

@jaredfholgate

@jaredfholgate Jared Holgate (jaredfholgate) commented Sep 16, 2026

Copy link
Copy Markdown
Member

Overview/Summary

Document module details and ownership changes through reviewed metadata.json pull requests, replacing the manual, issue-driven update path.

The supporting tooling has now shipped, so most of this is describing live behaviour rather than an intended future state. Metadata-driven CODEOWNERS and automated catalog publication are both running in production today. The remaining gates are about per-module adoption and access administration, not about whether the mechanism exists.

This PR fixes/adds/changes/removes

  1. Adds a metadata guide explaining which root or child file to edit, the supported fields, and the normal validation and review path. Root owners is a flat array containing every approved owner; children inherit it. Either eligible metadata code-owner team can approve. Metadata does not grant access or review rights.
  2. Covers ownership changes, transfers, orphaning ("owners": []), and adoption while retaining eligibility, written consent, handover, access approval, tracking issues, and required notices. Metadata-only changes do not trigger module releases.
  3. Documents how ModuleStatus is calculated from evidence rather than authored as a field, and that a module deprecated before it was ever published is omitted from the indexes entirely.
  4. Documents automated catalog publication, so contributors no longer ask the core team to publish an index update.
  5. Preserves real resource types, approved pattern/utility taxonomy, assigned telemetry, proposal approval, MAR approval, and language-specific retirement steps. The child-only helper contract retains JSON records and omits CSV rows.
  6. Simplifies existing owner guidance across contribution pages, FAQs, specifications, triage instructions, and reusable messages, and removes obsolete inventory/registration references and internal-only links.

Latest update

Pushed commit a1c64a9 (docs: align metadata guidance with shipped catalog and CODEOWNERS tooling), which brings the branch in line with tooling merged after the previous push and merges main.

Corrections in this commit:

  1. Catalog publication is automated. The sync runs at 01:33, 05:33, 09:33, 13:33, 17:33 and 21:33 UTC, regenerating the six canonical CSVs and v1/modules.json and publishing them without a core-team request. Previously the docs said publication was coordinated manually.
  2. CODEOWNERS fallback team corrected. SNFR20 said /avm/ mapped to @Azure/azure-verified-modules-module-contributors. The live file maps it to @Azure/azure-verified-modules-module-owners. This was a factual error in the normative spec.
  3. CODEOWNERS generation documented. Entries are generated per module from each root metadata.json, with no two-owner cap, and the file must not be hand-edited. The generated file ends with a metadata.json rule listing the two metadata teams, which is why a metadata change routes to them rather than to the module's own owners.
  4. Bicep literal parity narrowed. moduleDisplayName is independent of the metadata name literal in main.bicep; only moduleDescription must match its source literal. The previous text required both.
  5. Metadata may precede source. For approved modules, metadata.json can exist before the module source; the module stays Proposed until published. The previous text said not to create placeholder metadata.
  6. Terraform submodules are excluded from the CSV indexes, not just helpers, and ParentModule names the family root rather than the immediate parent.
  7. Scaffolding example is now runnable. The previous flag list was not usable as written, because -InputObject takes a hashtable and cannot be supplied as a CLI string flag. Replaced with the supported Initialize-AvmModuleMetadata cmdlet form.
  8. Terraform repository creation. telemetryIdPrefix is optional and is minted as 46d3xtrf.<res|ptn>.<7 hex> when omitted; the ownerTeam parameter is now documented.

Breaking Changes

  1. Documentation only. No schema, tooling behaviour, production setting, or authorization changes.
  2. Normal metadata code-owner review, separate access approval, and source-change validation/release requirements remain.

Verified implementation dependencies

  • Azure/azure-verified-modules-tools#138 merged at 2026-09-18T12:06:14Z, merge commit 9004c3b.
  • Azure/azure-verified-modules-tools#134 merged at 2026-09-18T18:34:10Z, at the previously reviewed head a565bdd633d345c572c31b130e0915430fe1332b. This supersedes the earlier note in this PR that it was open and unmerged. The child-only helper contract is released: v0.15.2 (18 September) and v0.16.0 (21 September) both post-date it, so the earlier "v0.15.1 is not helper-compatible" caveat no longer applies.
  • Metadata-driven CODEOWNERS is live. The BRM CODEOWNERS file now carries generated per-module owner entries sourced from metadata.json. Note that its header still reads "generated automatically from the AVM module indexes", which is legacy wording; the docs describe the actual metadata source rather than quoting that header.
  • Automated catalog publication is live. azure-verified-modules[bot] is committing "chore: synchronize AVM module catalogs" to main on the four-hourly schedule, the test-*.csv previews were removed in chore: remove temporary module catalog CSVs #2952, v1/modules.json is published, and the CanonicalType column has been dropped from the CSV headers.

Rollout gates

  • Approvals and exact-head CI for Azure/azure-verified-modules-tools#134. Merged 18 September at the reviewed head and released in v0.15.2 / v0.16.0.
  • Confirm compatible tooling, metadata files, human review protection, and release guards are adopted for each affected target. Apply the helper addition only to reviewed helper submodules; preserve existing valid metadata/source and separate excluded roots. Verify stable collision-checked telemetry identifiers where required.
  • Authorized administrators verify both metadata code-owner teams' visible write access and the App installation/authorization for the particular target. Either eligible team can satisfy normal human review. Keep per-target access and operation checks; this documentation change grants no new access or authority.
  • Resolve proposals without repository/source files. Preserve proposal approval, #RFRC, and issue tracking; keep excluded roots, archived review-only repositories, and missing/proposed/private targets separate. Catalog rows require valid metadata. Note that metadata-only modules are now supported and surface as Proposed, which changes how these are handled.
  • Catalog publication and the separate canonical CSV changeover are ready. The changeover has happened: canonical CSVs and v1/modules.json are published automatically, test-*.csv previews are removed, and helpers remain JSON-only.
  • Align public documentation adoption with rollout and update the internal Azure-Verified-Modules-Docs runbook to cover the four-hourly catalog sync, metadata-driven CODEOWNERS, and the status precedence rules. Add to an existing open documentation change where possible.

Validation

  • Hugo Extended 0.136.5 (the version pinned in hugo-build-pr-check.yml) with --gc --minify --ignoreCache: builds clean, 934 pages, 395 static files. Note that the pinned theme does not build on current Hugo releases, so the pinned version is required locally.
  • Anchors: every module-metadata/#… and avm-issue-triage/#… reference across the built site resolves against its target page, including the new #module-status section.
  • Scope: 13 Markdown files changed; no generated index data, workflow, module source, or permission changes.
  • Preserved behaviour: root ownership and child inheritance, either-team review, access separation, metadata-only release guard, helper semantics, telemetry assignment, proposal/MAR approval, and retirement requirements. Bicep source-literal parity is now correctly scoped to moduleDescription only.

As part of this Pull Request I have

  • Read the Contribution Guide and ensured this PR is compliant with the guide
  • Checked for duplicate Pull Requests
  • Associated it with relevant GitHub Issues or ADO Work Items (Internal Only)
  • Ensured my code/branch is up-to-date with the latest changes in the main branch
  • Ensured PR tests are passing
  • Updated relevant and associated documentation (e.g. Contribution Guide, Docs etc.)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Jared Holgate (jaredfholgate) added a commit to Azure/bicep-registry-modules that referenced this pull request Sep 16, 2026
## Description

Add initial module-owned metadata directly to this repository, allow
metadata review by either engineering owners or module owners, and keep
metadata-only changes out of automatic publishing workflows.

- Add **572 `metadata.json` files: 222 roots and 350 children**. All 573
`main.bicep` directories were inventoried; the unpublished internal
`avm/ptn/ai-ml/ai-foundry/modules/project` helper is excluded.
- Root `owners` is a **flat string array**. Preserve all **281 username
entries**, their order/casing, and every MEMBER/MAINTAINER handle
incorporated from the supplied 2026-09-10 snapshot and official indexes.
Thirteen roots have more than two owners; nine genuinely missing owner
lists remain `owners: []`. No deleted legacy team or replacement owner
is invented.
- Authored metadata contains **no `schemaVersion` or `tier`**. The
versioned `$schema` URL remains unchanged. Children do not author
owners. Bicep deprecation is derived from existing `DEPRECATED.md`; no
lifecycle field or deprecation/source edit is introduced here.
- End `.github/CODEOWNERS` with exactly `metadata.json
@Azure/azure-verified-modules-engineering-owners
@Azure/azure-verified-modules-module-owners`, after every module/tooling
rule. **Approval from either team qualifies; approval from both is not
required.** Other ownership remains unchanged.
- Append `!avm/**/metadata.json` to all **217** current per-module
resource, pattern, and utility publishing workflows. Generic
validation/tag-preview remains eligible for metadata changes. Manual
release/approval controls and both existing `main.json`/`version.json`
release selectors remain unchanged.
- Cover root/nested/unindexed ownership, final precedence,
metadata-only/mixed/source/version changes, child release selection, and
explicit manual releases with offline regressions.

### Approved metadata reviewer policy

Commit **2fe528df6fe20f849fb79055589677098357680c** implements the
user-approved two-team OR policy. It changes only `.github/CODEOWNERS`,
the module governance assertion, and the focused ownership tests. The
final basename rule covers root, child, deep, utility, pattern,
resource, and unindexed metadata paths. Tests reject missing approved
teams, an unapproved third team/person, narrowed coverage, and shadowing
rules.

All **572 metadata files**, source/deprecation files, workflow filters,
release selectors, and manual controls are unchanged from the approved
shape below. No GitHub access or review settings are changed.

### Approved authored-shape update

Commit **7f3502d7fb3cb9aa4e6e37911b494205b9619230** changes only the 572
metadata files: remove `schemaVersion`, remove root `tier`, and replace
root owner objects with ordered string arrays. Any nonempty qualified
team would be retained as an array entry; this backfill had none.

Compared with baseline `7fe0438eff8b2b9f4595ec39254c2e2a3213e6e7`,
native JSON checks verify that **every unaffected raw field value is
identical**, including `$schema`, names, descriptions, canonical types,
telemetry, aliases, and comments. All owner strings and their order are
preserved. Nine empty owner arrays and fourteen approved
unpublished-child telemetry omissions are retained. All 572 files pass
the ready shared schema and current source-literal validation.

No source, compiled template, version, workflow, governance,
deprecation, or test file changed in this shape-update commit. Its
actual staged and committed diffs both select **zero module release
templates**.

### Main integration and readiness

Merged `origin/main` **dfa9bab2c46e97b018b0d7b987537f738f6c0ef5** into
this published branch without rebasing or force-pushing, in merge commit
**7fe0438eff8b2b9f4595ec39254c2e2a3213e6e7**.

That merge includes
[#7351](#7351), BAMI
canary validation-variable selection, and
[#7348](#7348), the
PostgreSQL configuration update. BAMI changes validation
tenant/subscription bindings, not workflow inventory or release
selection. Its selected-BAMI checks, legacy behavior for unselected
modules, and credential isolation remain unchanged.

A subsequent read-only compatibility check of main through
**f1f4ba28698437d9a683d68bf181341ad3547e48** found two newer commits
affecting 18 root modules. Their names, descriptions, telemetry
identifiers, canonical types, and all release/governance assumptions
remain compatible with this metadata. Those newer main commits were
**not merged** during the metadata-shape or reviewer-policy updates. Any
required final integration/revalidation remains an explicit rollout
gate; checks on this branch do not claim to cover an unmerged combined
tree.

The review's module changes remain metadata additions only. No extra
`main.bicep`, `main.json`, `version.json`, module README, changelog,
runtime backfill workflow, approval files, reviewed flags, live settings
changes, workflow dispatches, or remote merges are introduced.

### Telemetry and existing data

Fourteen uninstrumented, unpublished resource children intentionally
omit `telemetryIdPrefix`. Each lacks a version file,
publishing-allowlist entry, index entry, and telemetry resource.
[BCPFR4](https://azure.github.io/Azure-Verified-Modules/spec/BCPFR4)
requires top-level telemetry but exempts nested children unless enabled
for direct publishing. Their parents emit telemetry;
[BCPFR7](https://azure.github.io/Azure-Verified-Modules/spec/BCPFR7)
also requires resource parents to disable telemetry on referenced
published modules. Redis child publishing was explicitly rolled back for
upcoming service deprecation in
[#7096](#7096).

The backfill preserves these **pre-existing issues for separate
source/release follow-up**:

- Budget `rg-scope` and `sub-scope` currently emit
`46d3xbcp.res.consumption-budget_mgscope`. Metadata records the actual
source value, not the differing CSV values.
- Resource Graph query currently emits `46d3xbcp.resourcegraph-query`,
without `.res.`. Metadata preserves this exact, narrowly supported
legacy identifier.
- The existing compiled
`avm/ptn/sa/conversation-knowledge-mining/main.json` lacks metadata
name/description fields. Its new metadata matches current Bicep
literals; compiled output is left untouched by this change.

Metadata-only edits, including `telemetryIdPrefix`, do not publish.
Publishing an output-affecting metadata change still requires a normal
source change with generated `main.json`, or a `version.json` release
change.

### Enforcement and coordinated rollout

Active default-branch ruleset **23285568 still has
`require_code_owner_review=true` and one required approving review**,
with no separate required-reviewer list. Both approved teams are visible
and have existing write access. GitHub treats multiple owners on the
same CODEOWNERS line as alternatives, so either team's approval
satisfies this metadata ownership requirement, not both. Existing
authorized AVM App bypass settings are untouched; actor details were not
exposed by the read credential and remain an operator-verification
prerequisite. CODEOWNERS enforcement uses the adopted base-branch rule.
Previously reported unrelated owner-access warnings are not changed by
this policy update.

Follow the [coordinated rollout
plan](https://github.com/Azure/azure-verified-modules-tools/blob/jaredfholgate-module-metadata-implementation/docs/metadata-rollout.md):
operator-approved Bicep Sync pause before the metadata tools merge, and
resume only after repository and generated governance agree on the exact
two-team rule and the operator approves scheduled applies.

- **Sole active tools dependency:**
[Azure/azure-verified-modules-tools#113](Azure/azure-verified-modules-tools#113)
at **db2cf27af7befc4bf1e8dc271f2da084489c62df** consolidates the shared
schema, authoring, catalog, and generated CODEOWNERS policy. Its exact
final two-team rule matches this registry head
`2fe528df6fe20f849fb79055589677098357680c`. The updated v1 schema must
be available before consumers validate the flat authored shape against
its public URL.
- **Final tools CI confirmed on that exact head:** [CI run
35123274927](https://github.com/Azure/azure-verified-modules-tools/actions/runs/35123274927)
passed all **11 jobs**, including three operating-system builds and six
integration legs. [Configuration
validation](https://github.com/Azure/azure-verified-modules-tools/actions/runs/35123274975)
passed both jobs, and
[CodeQL](https://github.com/Azure/azure-verified-modules-tools/actions/runs/35123270783)
passed. All **17 reported current-head checks are successful**. The
tools review remains OPEN/MERGEABLE, but GitHub reports BLOCKED for an
unverified policy reason; successful CI does not establish that every
merge or rollout gate is satisfied.
- Historical policy work
[Azure/azure-verified-modules-tools#120](Azure/azure-verified-modules-tools#120)
is **CLOSED as superseded, not merged**, after its full history was
consolidated into the tools implementation. Its branch is retained and
it is no longer a separate merge dependency. The generator repair
[Azure/azure-verified-modules-tools#119](Azure/azure-verified-modules-tools#119)
is merged.
- Public workflow template/contribution guidance:
[Azure/Azure-Verified-Modules#2929](Azure/Azure-Verified-Modules#2929)
is merged. Public process documentation remains a separate draft in
[Azure/Azure-Verified-Modules#2936](Azure/Azure-Verified-Modules#2936)
at `5ff656df746a0a3e1c213438cc56621959f55cec`.

## Pipeline Reference

<!-- Insert your Pipeline Status Badge below -->

| Validation | Result |
| --- | --- |
| Current reviewer policy: ownership and release regression suites |
**355 passed**, zero failures/skips; covers either approved team,
unindexed/deep metadata and unapproved third owners |
| Current reviewer policy: change boundary | Exactly three governance
files; all 572 metadata files and release controls unchanged |
| Current reviewer policy: committed release diff | **Zero publishable
templates** selected |
| Authored shape: ready schema and source literals | **572 passed**;
schema SHA256
`BE3945F44CABE20C6DD078911D762B18CB684C29E59D8CA830666C06A45AE087` |
| Authored shape: unaffected raw values and owner order | All 572 files
match the original values; all 281 usernames preserved |
| Authored shape: actual staged/committed diff, Prettier and whitespace
| Zero release templates; all 572 formatting checks passed |
| Prior main integration: combined BAMI/CI-parameter and metadata
regressions | 387 passed at `7fe0438` |
| Prior main integration: Actionlint 1.7.12 | 221 publishing
workflows/templates passed; three unsupported `queue` diagnostics in
unchanged `avm.module.yml` reproduce on main |
| Prior upstream PostgreSQL source/test compilation | Both compiled
without rewriting files; two existing API/module-age warnings |

The original three per-module YAML formatting warnings in
api-center.service, azd.apim-api, and sa.content-generation remain
unchanged. No concurrency or release control was weakened to silence an
older linter. Fresh automatic checks are evaluated on exact
reviewer-policy head `2fe528df6fe20f849fb79055589677098357680c`; no
Azure deployment/release workflow was dispatched.

## Type of Change

<!-- Use the checkboxes [x] on the options that are relevant. -->

- Azure Verified Module updates:
- [ ] Bugfix containing backwards-compatible bug fixes, and I have NOT
bumped the MAJOR or MINOR version in `version.json`:
- [ ] Feature update backwards compatible feature updates, and I have
bumped the MINOR version in `version.json`.
- [ ] Breaking changes and I have bumped the MAJOR version in
`version.json`.
  - [ ] Update to documentation
- [x] Update to CI Environment or utilities (Non-module affecting
changes)

## Checklist

- [x] I'm sure there are no other open Pull Requests for the same
update/change
- [ ] I have run `Set-AVMModule` locally to generate the supporting
module files.
- [ ] My corresponding pipelines / checks run clean and green without
any errors or warnings
- [ ] I have updated the module's CHANGELOG.md file with an entry for
the next version

`Set-AVMModule`, module changelogs, and Azure deployment validation are
intentionally not applicable to the metadata-only module diff. Offline
results and pre-existing tool/compiler warnings are recorded above.

<!-- Please keep up to date with the contribution guide at
https://aka.ms/avm/contribute/bicep -->

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Document that avm metadata initialize (Avm.Authoring) must be used to
scaffold a valid metadata.json for every new Bicep/Terraform root module
and child module/submodule, with root modules getting full owner
metadata and children getting the reduced inherited-owner shape.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ling

Update the metadata documentation to match the tooling merged after this
branch was last pushed.

- Catalog publication is automated on a four-hourly schedule rather than
  coordinated manually with the core team.
- Document how ModuleStatus is calculated and that a module deprecated
  before publication is omitted from the indexes.
- Correct the BRM CODEOWNERS fallback team and explain that entries are
  generated from each root metadata.json, including why the trailing
  metadata.json rule routes metadata review to the two metadata teams.
- moduleDisplayName is independent of the Bicep metadata name literal;
  only moduleDescription must match its source literal.
- Metadata may be created before module source exists for approved
  modules, which stay Proposed until published.
- Terraform submodules are excluded from the CSV indexes, and
  ParentModule names the family root.
- Replace the unrunnable avm metadata initialize flag list with the
  supported Initialize-AvmModuleMetadata cmdlet form.
- Terraform repository creation mints a telemetry ID prefix when one is
  not supplied, and supports an ownerTeam parameter.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@jaredfholgate
Jared Holgate (jaredfholgate) marked this pull request as ready for review September 22, 2026 00:17
@jaredfholgate
Jared Holgate (jaredfholgate) merged commit e8d8c4d into main Sep 22, 2026
7 checks passed
@jaredfholgate
Jared Holgate (jaredfholgate) deleted the jaredfholgate-metadata-maintenance-docs branch September 22, 2026 00:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant